package  com.bawei.lib_net.interceptor

import okhttp3.Interceptor
import okhttp3.RequestBody
import okhttp3.Response
import okio.Buffer
import java.nio.charset.StandardCharsets

/**
 * @description 签名拦截器  和后台做对接，密钥
 */
class SignInterceptor:Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {

        //1.和后台对接：密钥/sign生成规则 ---》sign签名
        //情况一：请求体转成字符串 --》拼接上密钥盐 --》md5加密---》转16进制---》sign签名
        //情况二：请求参数按照字典顺序（加上时间戳）--》拼接上密钥盐--》md5加密---》转16进制---》sign签名
        val sign = createSign(chain.request().body)

        //2.和后台对接：sign签名放置位置
        //情况一：添加sign请求头
        //情况二：添加sign到请求体
        val request = chain.request().newBuilder()
            .addHeader("x-api-sign",sign)//签名
            .addHeader("x-api-signType", "MD5") //签名加密方式
            .addHeader("x-api-accessKey","23022113430907CF0113")//访问密钥
            .build()

        return chain.proceed(request)

    }

    /**
     * 生成签名
     */
    private fun createSign(newBody: RequestBody?): String {
        val params = bodyToString(newBody) //请求体参数
        val key = "6eef7179f83aea3986f7dd9be4c5cd8a" //密钥盐
        val buffer = Buffer()
        buffer.write(params.toByteArray(StandardCharsets.UTF_8))
        buffer.write(key.toByteArray(StandardCharsets.UTF_8))
        return buffer.md5().hex()
    }

    /**
     * body-->json字符串
     */

    private fun bodyToString(requestBody:RequestBody?):String{
        val buffer = Buffer()
        try {
            requestBody?.writeTo(buffer)
        }catch (e:Exception){
            return "something error,when show requestBody"
        }
        return buffer.readUtf8()

    }

}